module EJ4 where

import TP
import Arbol23
 
--Defino funciones similares a foldNat
--El problema que veo con foldNat 
-- es que la expasion es f(f(f(f(....f(caso base)))))
-- no me queda claro que f usar para que haga la posta
truncHoja::a->a->Integer->Arbol23 a b
truncHoja e x 0= Hoja e
truncHoja e x n= Hoja x

truncDos::a->b->(Integer->Arbol23 a b)->(Integer->Arbol23 a b)->Integer->Arbol23 a b
truncDos e x rec_izq rec_der 0= Hoja e
truncDos e x rec_izq rec_der n= Dos x (rec_izq (n-1)) (rec_der (n-1))

truncTres::a->b->b->(Integer->Arbol23 a b)->(Integer->Arbol23 a b)->(Integer->Arbol23 a b)->Integer->Arbol23 a b
truncTres e x y rec_izq rec_med rec_der 0= Hoja e
truncTres e x y rec_izq rec_med rec_der n= Tres x y (rec_izq (n-1)) (rec_med (n-1)) (rec_der (n-1))

truncar::a->Integer->Arbol23 a b->Arbol23 a b
truncar a n arbol= foldA23 (truncHoja a) (truncDos a) (truncTres a) arbol n

-- Version con foldNat
truncarBase::a->Arbol23 a b->Arbol23 a b
truncarBase a _ = Hoja a
  
truncarAux::(Arbol23 a b->Arbol23 a b)->Arbol23 a b->Arbol23 a b
truncarAux f (Hoja x)= (Hoja x)
truncarAux f (Dos x izq der)= Dos x (f izq) (f der)
truncarAux f (Tres x y izq med der)= Tres x y (f izq) (f med) (f der)

truncar2::a->Integer->Arbol23 a b->Arbol23 a b
truncar2 a n arbol= (foldNat truncarAux (truncarBase a)) n arbol
